package cn.finder.producer;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;

// 委托单数据模型
public class EntrustOrder {
    private long entrust_id;  //委托单ID
    private String symbol; // 交易对 trade pair

    // 买卖方向
    // B(buy)
    // S(sell)
    // 当 Entrust_type ="C", 也要标识此单是卖单还是买单
    private String buy_sell;

    private double amt; //数量
    private double price; //单价
    private long entrusted_time; //挂单时间  unix 时间


    // L: Limit 限价单


    // M: market 市价单, 普通市价单 按照对方最优价，未成交的放入队列。
    // - Price 为账户总金额 ;如 stc_usdt=> 表示用usdt 作价 stc，传入的是 usdt 总金额(数量)
    // 传递参数 extra={"level":30} 通过level自定义 最优 N 挡位

    // MC: IOC(Immediately or Cancel) 市价头部去成交，如果成交不了，余下撤回 不放队列，其余撤单
    //     MC: 传递参数 extra={"level":30} 通过level自定义 最优 N 挡位

    // M5： 市价单， 按前5档成交，若余撤单
    // MF: FOK(Fill or Kill) 订单若不能全部成交则立即全部取消  暂时不需要
    // MTL: 本方最优价

    // CON: 条件委托: 设定促发价格，然后买入或者卖出一定数量。 但是在撮合引擎中体现的可能是 市价单
    // - 条件单 : 参数: 1. 触发价格(信号) signal_price  2. 挂单价格 price  3. 挂单数量 amt  4.买卖方向 buy_sell
    //  T1： 止盈 =》 上涨了 卖出 TP(takeprofit)
    //  T2： 止损 =》 下跌了 卖出 SL (STOP LOSS)
    //  T3:  追涨 =》 上涨了 买入 BU (buy up)
    //  T4:  回踩 =》 下跌了 买入 SB (Step back)
   // 数据格式 // Extra:{action:"TP",signal_price:5.0,price:200}


    // C: Cancel 取消单  撤单只表示发送给撤单命令成功与否，不一定真正撤销，撤销结果根据 order_type 和 entrust_id 消息确定
    // CC: Condition Cancel: 条件单取消
    // B: 备份 : Symbol 为空 或者 all ，则备份所有启动的引擎
    private String entrust_type;


    private double maker_charge;//挂单成交手续费 0.018%
    private double taker_charge;  //吃单成交手续费 万2： 0.02%
    private String market_type; // ( 可选)交易方式 (C)C2C | (S)SPOT | (LF)LEVER-FULL 全仓杠杆 | (LP) LEVER-POSITION 逐仓杠杆,
    private String source; //(可选) 请求来源,数据来源 [web | app | api(接口)]

    private Object Extra ;// （可选） 扩展数据,根据具体业务设定; 建议使用 json 字符串格式。


    public long getEntrust_id() {
        return entrust_id;
    }

    public String getSymbol() {
        return symbol;
    }

    public String getBuy_sell() {
        return buy_sell;
    }

    public double getAmt() {
        return amt;
    }

    public double getPrice() {
        return price;
    }

    public long getEntrusted_time() {
        return entrusted_time;
    }

    public String getEntrust_type() {
        return entrust_type;
    }

    public double getMaker_charge() {
        return maker_charge;
    }

    public double getTaker_charge() {
        return taker_charge;
    }

    public String getMarket_type() {
        return market_type;
    }

    public String getSource() {
        return source;
    }

    public Object getExtra() {
        return Extra;
    }

    public void setEntrust_id(long entrust_id) {
        this.entrust_id = entrust_id;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public void setBuy_sell(String buy_sell) {
        this.buy_sell = buy_sell;
    }

    public void setAmt(double amt) {
        this.amt = amt;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void setEntrusted_time(long entrusted_time) {
        this.entrusted_time = entrusted_time;
    }

    public void setEntrust_type(String entrust_type) {
        this.entrust_type = entrust_type;
    }

    public void setMaker_charge(double maker_charge) {
        this.maker_charge = maker_charge;
    }

    public void setTaker_charge(double taker_charge) {
        this.taker_charge = taker_charge;
    }

    public void setMarket_type(String market_type) {
        this.market_type = market_type;
    }

    public void setSource(String source) {
        this.source = source;
    }

    public void setExtra(Object extra) {
        Extra = extra;
    }


    public String toJson(){
        ObjectMapper objectMapper = new ObjectMapper();
        ObjectWriter objectWriter = objectMapper.writerWithDefaultPrettyPrinter();

        try
        {
            return objectWriter.writeValueAsString(this);
        }
        catch (Throwable e)
        {
            throw new RuntimeException(e);
        }
    }
}
